/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bbva.generico.controller;

import java.io.ByteArrayInputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

import org.apache.log4j.Logger;
import org.primefaces.model.DefaultStreamedContent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import pe.com.bbva.leasing.util.encrypter.Encriptar;
import pe.com.grupobbva.ConfigMq;
import pe.com.grupobbva.ConfigPs9;
import pe.com.grupobbva.EjecutarTransaccionGenericaPS9Rq;
import pe.com.grupobbva.EjecutarTransaccionGenericaPS9Rs;
import pe.com.grupobbva.HeaderPs9;
import pe.com.grupobbva.Mensaje;
import pe.com.grupobbva.ServiceGenericTxProxy;

import com.bbva.generico.domain.Aplicacion;
import com.bbva.generico.service.LoginService;
import com.bbva.generico.service.MultitablaService;
import com.bbva.generico.service.TransaccionService;
import com.bbva.generico.to.GnrConfigColas;
import com.bbva.generico.to.GnrMultitabla;
import com.bbva.generico.to.GnrSistema;
import com.bbva.generico.util.Constantes;
import com.bbva.generico.util.MessageProvider;
import com.bbva.generico.util.SessionUser;
import com.bbva.generico.util.UtilClass;

/**
 *
 * @author WCCAICEDO
 */
@Controller
@SessionScoped
@ManagedBean
public class AccesoController {
    
    private static final Logger log = Logger.getLogger(AccesoController.class);
    
    @Autowired
    private TransaccionService transaccionService;
    
    @Autowired
    private LoginService loginService;
    
    @Autowired
    private MultitablaService multitablaService;

    private String usuario;
    private String password;
    private String messageErrorLogin;
	private List<Aplicacion> lstAplicaciones;
    
	public void onPageLoad(ComponentSystemEvent event) {
        try {
            if (!FacesContext.getCurrentInstance().isPostback()) {
                setUsuario(null);
                setPassword(null);
                setMessageErrorLogin(null);
                setLstAplicaciones(null);
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error(e.getMessage(), e);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
                    MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
        }
    }

    /**
     * Metodo de Logueo
     * @return
     */
    public String login() {
    	boolean test = true;
        try {
        	log.info("El usuario es: " + usuario + " , y el password es: " + password);
        	String dataMensaje = "";
        	EjecutarTransaccionGenericaPS9Rq validarLogin = new EjecutarTransaccionGenericaPS9Rq();
        	
        	//Session
        	SessionUser sessionUser = SessionUser.getInstance();
        	sessionUser.setUserSing(usuario);
        	sessionUser.setPasswordSing(password);

        	/**
        	 * Para obtener los parametros de configuracion
        	 * Tabla TGNR_CONFIGURACION_COLAS
        	 * Campo: Usuario_Logeo
        	 * Campo: URL_Servicio
        	 */
        	GnrConfigColas beanTrans = null;
        	beanTrans = transaccionService.consultaParametrosTransaccion(new BigDecimal(1));
        	ConfigMq objConfigMq = new ConfigMq();
        	
        	if (beanTrans != null) {
        		log.info("Conexion Database!");
        		objConfigMq.setQueueInputDist(beanTrans.getQueueinputdist());//"QLT.SPFI.RESP"
            	objConfigMq.setQueueOutputDist(beanTrans.getQueueoutputdist());//"QRT.SPFI.ENVIO.MPD1"
            	objConfigMq.setQueueOutputHost(beanTrans.getQueueoutputhost());//"QRT.SPFI.RESP.QMPTINT1"
            	objConfigMq.setQMgrHost(beanTrans.getQmgrhost());//"MPD1"
        	} else {
        		log.info("Sin conexion al Database/No accede al SERVICE!");
        		objConfigMq.setQueueInputDist("QLT.SPFI.RESP");
            	objConfigMq.setQueueOutputDist("QRT.SPFI.ENVIO.MPD1");
            	objConfigMq.setQueueOutputHost("QRT.SPFI.RESP.QMPTINT1");
            	objConfigMq.setQMgrHost("MPD1");
        	}
        	
        	ConfigPs9 objConfigPs9 = new ConfigPs9();
        	HeaderPs9 objHeader = new HeaderPs9();
        	objHeader.setIdProtocolo(beanTrans.getIdprotocolo());
        	objHeader.setTerminalLogicoInicial(beanTrans.getTerminallogicoinicial());//"D90L"
        	objHeader.setTerminalLogicoFinal(beanTrans.getTerminallogicofinal());//"D90L"
        	objHeader.setTerminalContable(beanTrans.getTerminalcontable());//"D90L"
        	objHeader.setUsuario(beanTrans.getUsuario());//"P015813"
        	objHeader.setTransCodeHost("LEI0");//"LEI0"
        	objHeader.setOpcionAplicacion("00");//"00"
        	objHeader.setIndicadorCommit(beanTrans.getIndicadorcommit());
        	objHeader.setTipoMensajeIn(beanTrans.getTipomensajein());//"1"
        	objHeader.setTipoProceso(beanTrans.getTipoproceso());//"O"
        	objHeader.setCanalComunicacion(beanTrans.getCanalcomunicacion());//"LS"
        	objHeader.setIndPreFormato(beanTrans.getIndpreformato());//"N"
        	objHeader.setLenguaje(beanTrans.getLenguaje());//"R"
        	
        	Mensaje objMensaje = new Mensaje();
        	objMensaje.setTipoMensaje("T");//"T"
        	
        	dataMensaje = UtilClass.setSpaceWhite(15) + usuario + UtilClass.setSpaceWhite(4) + password + UtilClass.setSpaceWhite(3) + "LE";
        	objMensaje.setDataMensaje(dataMensaje);
        	
        	objConfigPs9.setHeader(objHeader);
        	objConfigPs9.setMensaje(objMensaje);
        	
        	validarLogin.setConfigMq(objConfigMq);
        	validarLogin.setConfigPs9(objConfigPs9);
        	validarLogin.setCodigoSistema("01");
        	
        	
        	//BBVA: http://118.180.36.26:7801/bbva/genericTransaction/ejecutarTransaccionGenericaPS9/
        	//Test: http://172.30.9.57:7801/bbva/genericTransaction/ejecutarTransaccionGenericaPS9/
        	//Instanciando el WS
        	ServiceGenericTxProxy webService = new ServiceGenericTxProxy();
        	if ( test ) {
        		//BBVA Test
        		log.info("WS Test");
        		webService.setEndpoint("http://172.30.9.57:7801/bbva/genericTransaction/ejecutarTransaccionGenericaPS9/");
        		
        	} else {
        		//BBVA Prod
        		log.info("WS Prod");
        		webService.setEndpoint("http://118.180.36.26:7801/bbva/genericTransaction/ejecutarTransaccionGenericaPS9/");
        	}
        	log.info("Se instancio el WS");
        	
        	EjecutarTransaccionGenericaPS9Rs resp = webService.ejecutarTransaccionGenericaPS9(validarLogin);
        	
        	String codigo = "";
        	if (resp.getHeader().getInfo() != null) {
        		codigo = resp.getHeader().getInfo(0).getCodigo();
        		log.info("Rpta del webservice: " + codigo);
        	} else if (resp.getHeader().getError() != null) {
        		codigo = resp.getHeader().getError(0).getCodigo();
        		log.info("Rpta del webservice: " + codigo);
        	}
        	
            if (codigo.equals(Constantes.VALIDO)) {
            	//Obtenemos la lista de aplicaciones a las cuales tiene acceso el usuario
            	dataMensaje = UtilClass.setSpaceWhite(15) + usuario + UtilClass.setSpaceWhite(3) + "LEIA" + UtilClass.setSpaceWhite(2) +
            	"00" + UtilClass.setSpaceWhite(2) + "LEIB" + UtilClass.setSpaceWhite(3) + "00";
            	objMensaje.setDataMensaje(dataMensaje);
            	objConfigPs9.setMensaje(objMensaje);
            	
            	EjecutarTransaccionGenericaPS9Rq listarAplicaciones = new EjecutarTransaccionGenericaPS9Rq();
            	listarAplicaciones.setConfigMq(objConfigMq);
            	listarAplicaciones.setConfigPs9(objConfigPs9);
            	listarAplicaciones.setCodigoSistema("01");
            	//Instanciando el WS
            	webService.setEndpoint("http://172.30.9.57:7801/bbva/genericTransaction/ejecutarTransaccionGenericaPS9/");
            	
            	EjecutarTransaccionGenericaPS9Rs resp2 = webService.ejecutarTransaccionGenericaPS9(listarAplicaciones);
            	
            	/*
            	if (resp.getHeader().getInfo() != null) {
            		codigo = resp2.getHeader().getInfo(0).getCodigo();
            		log.info("Rpta del webservice: " + codigo);
            	} else if (resp.getHeader().getError() != null) {
            		codigo = resp.getHeader().getError(0).getCodigo();
            		log.info("Rpta del webservice: " + codigo);
            	}*/
            	
            	//Mostrando la lista - Should be 1er IF ...
            	lstAplicaciones = obtenerAplicaciones();
            	
            	log.info("Resultado del envio!");
                return "principal.xhtml?faces-redirect=true";
                
            } else if (codigo.equals(Constantes.DESACTIVA)) {
            	messageErrorLogin = MessageProvider.getInstance().getValue("MSG_ERROR_WS");
                return "login.xhtml?faces-redirect=false";
            } else {
				messageErrorLogin = MessageProvider.getInstance().getValue("MSG_ERROR_LOGIN_USER");
                return "login.xhtml?faces-redirect=false";
            }
            
        } catch (Exception e) {
            e.printStackTrace();
			log.error(e.getMessage(),e);
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
                    MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
            return "login.xhtml?faces-redirect=false";
        }
    }
    
    
    public List<Aplicacion> obtenerAplicaciones() {
    	Aplicacion aplicacion = new Aplicacion();
    	lstAplicaciones = new ArrayList<Aplicacion>();
    	
    	GnrMultitabla multitabla = new GnrMultitabla();
    	String claveUnica = "";
    	
    	try {
			multitabla = multitablaService.getSelectByCodigoTabla(new BigDecimal(1));
			claveUnica = multitabla.getNombreCampo();
		} catch (Exception e2) {
			e2.printStackTrace();
		}
    	
    	String u1 = SessionUser.getInstance().getUserSing();
    	String p2 = SessionUser.getInstance().getPasswordSing();
    	String userEnc = "";
    	String passEnc = "";
    	String aplicEnc = "";
    	
    	try {
			userEnc = Encriptar.codifica(u1, claveUnica);
			passEnc = Encriptar.codifica(p2, claveUnica);
			aplicEnc = Encriptar.codifica("LE", claveUnica);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
    	
//    	BufferedImage bufferedImg = new BufferedImage(100, 25, BufferedImage.TYPE_INT_RGB);
//        Graphics2D g2 = bufferedImg.createGraphics();
//        g2.drawString("This is a text", 0, 10);
        
    	try {
    		int i = 0;
			GnrSistema beanImagen = null;
			beanImagen = loginService.consultaImagenes(new BigDecimal(5));
			log.info("Obteniendo las aplicaciones!");
			System.out.println("Here!!!");
			for (i = 0; i < 2; i++) {
				aplicacion.setCodigo(i+"");
				aplicacion.setDescripcion(beanImagen.getDescripcion());
				log.info("bean :" + beanImagen.getDescripcion());
				
//				ByteArrayOutputStream os = new ByteArrayOutputStream();
//				ImageIO.write(bufferedImg, "jpeg", os);
				/*
				File file = new File("D:\\Imagenes\\Audi.jpg");
				
				FileInputStream os = new FileInputStream(file);
				byte[] b = new byte[1024];
				ByteArrayOutputStream ob = new ByteArrayOutputStream();
				
				while(os.read(b) == 1) {
					ob.write(b);
				}*/
				
				//beanImagen.getImagen() //ob.toByteArray()
				aplicacion.setGraphicText(new DefaultStreamedContent(new ByteArrayInputStream(beanImagen.getImagen()), "image/jpeg"));
				
				aplicacion.setEstado(true);
				//?user=u1&password=p2
				aplicacion.setUrl(beanImagen.getUrl() + "?user=" + userEnc + "&password=" + passEnc + "&aplicacion=" + aplicEnc);
//				aplicacion.setUrl(beanImagen.getUrl());
				lstAplicaciones.add(aplicacion);
				log.info("-Obtener aplicaciones ---> Cargando la lista: " + lstAplicaciones.get(i).getEstado());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
    	return lstAplicaciones;
    }
    

    /**
     * @return the usuario
     */
    public String getUsuario() {
        return usuario;
    }

    /**
     * @param usuario the usuario to set
     */
    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    /**
     * @return the password
     */
    public String getPassword() {
        return password;
    }

    /**
     * @param password the password to set
     */
    public void setPassword(String password) {
        this.password = password;
    }

    /**
     * @return the messageErrorLogin
     */
    public String getMessageErrorLogin() {
        return messageErrorLogin;
    }

    /**
     * @param messageErrorLogin the messageErrorLogin to set
     */
    public void setMessageErrorLogin(String messageErrorLogin) {
        this.messageErrorLogin = messageErrorLogin;
    }
    
    public List<Aplicacion> getLstAplicaciones() {
		return lstAplicaciones;
	}

	public void setLstAplicaciones(List<Aplicacion> lstAplicaciones) {
		this.lstAplicaciones = lstAplicaciones;
	}
}
